package fr.thelem.gestiondemandesthelem.web.actions;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;

import org.springframework.security.core.context.SecurityContextHolder;

import fr.thelem.gestiondemandesthelem.dao.model.CDParametreDemandeEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CDParametreDemandeValeursEntity;
import fr.thelem.gestiondemandesthelem.dao.model.CDPointDeControleEntity;
import fr.thelem.gestiondemandesthelem.dao.model.PersonneEntity;
import fr.thelem.gestiondemandesthelem.service.IAppliService;

public class EffectuerDemandeAction extends BaseAction {

    /** Attribut serialVersionUID */
    private static final long serialVersionUID = 3225764601140863027L;

    private IAppliService appliService;
    private Map<String, String> res = new HashMap<String, String>();
    private String typeSaisie;
    private String description;
    private int idDemande;
    private int idParamDemande;
    private String error;
    private String obligatoire;
    private String dateCorrecte;
    private String dateAVerifier;

    /** Attributs pour la récupération du formulaire **/
    private int idCDDemande;
    private String referenceDemande;
    private String titreDemande;
    private Map<String, String> paramsDemande = new HashMap<String, String>();
    private Map<String, String> paramsMulti = new HashMap<String, String>();
    private Map<String, String> paramsListe = new HashMap<String, String>();
    private String commentaireDemande;
    private LinkedList<String> listeIdCDPointsControle = new LinkedList<String>();
    private LinkedList<String> listeNomsCDPointsControle = new LinkedList<String>();

    /** Methodes **/

    public String recupererCDPointDeControle() {
        for (CDPointDeControleEntity pc : appliService.recupererCDPointsControle(idDemande)) {
            listeIdCDPointsControle.add(String.valueOf(pc.getIdentifiantCDPointDeControle()));
            listeNomsCDPointsControle.add(pc.getNomCDPointDeControle());
        }
        return SUCCESS;
    }

    public String recupererCDParametreDemande() {
        for (CDParametreDemandeEntity p : appliService.recupererCDParametreDemande(idDemande)) {
            if (appliService.recupererObligatoire(p.getIdentifiantParametreDemande(), idDemande)) {
                String nom = p.getNomParametreDemande();
                nom = nom + " *";
                res.put(String.valueOf(p.getIdentifiantParametreDemande()), nom);
            } else {
                res.put(String.valueOf(p.getIdentifiantParametreDemande()), p.getNomParametreDemande());
            }
        }
        return SUCCESS;
    }

    public String recuperationTypeSaisie() {
        typeSaisie = appliService.recupererTypeSaisieCDParametreDemande(idParamDemande);
        return SUCCESS;
    }

    public String recupererCDParametreDemandeValeurs() {
        for (CDParametreDemandeValeursEntity p : appliService.recupererCDParametreDemandeValeurs(idParamDemande)) {
            res.put(String.valueOf(p.getIdentifiantCDParametreDemandeValeurs()), p.getValeurCDParametreDemandeValeurs());
        }
        return SUCCESS;
    }

    public String recupererDescriptionParametreDemande() {
        description = appliService.recupererDescriptionCDParametreDemande(idDemande, idParamDemande);
        if (description == null) {
            return ERROR;
        } else {
            if (description.equalsIgnoreCase("")) {
                return ERROR;
            }
        }
        return SUCCESS;
    }

    public String recuperationObligatoire() {
        obligatoire = String.valueOf(appliService.recupererObligatoire(idParamDemande, idDemande));
        return SUCCESS;
    }

    public String verifierDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
        SimpleDateFormat sdfrendu = new SimpleDateFormat("dd/MM/yyyy");
        sdf.setLenient(false);
        try {
            sdf.parse(dateAVerifier);
            dateCorrecte = sdfrendu.format(sdf.parse(dateAVerifier));
        } catch (Exception e) {
            dateCorrecte = String.valueOf(false);
        }
        return SUCCESS;
    }

    public String effectuerDemandeForm() throws Exception {
    	
        PersonneEntity personne = appliService.recupererPersonne(SecurityContextHolder.getContext().getAuthentication().getName());
        appliService.ajouterCPDemande(idCDDemande, titreDemande, referenceDemande, paramsDemande, paramsMulti, commentaireDemande, personne);
        return SUCCESS;
    }

    public String isTitreExiste() throws Exception {
        error = "false";
        if (appliService.isTitreExiste(titreDemande)) {
            error = "true";
        }
        return SUCCESS;
    }

    public String execute() throws Exception {
        this.ajouterRoleSession();
        this.ajouterValeurSession("typesDemandes", appliService.recupererTypesDemande());
        return SUCCESS;
    }

    /**
     * Accesseur de appliService
     * 
     * @return le appliService
     */
    public IAppliService getAppliService() {
        return appliService;
    }

    /**
     * Affectation de appliService
     * 
     * @param appliService appliService à affecter
     */
    public void setAppliService(IAppliService appliService) {
        this.appliService = appliService;
    }

    /**
     * Accesseur de res
     * 
     * @return le res
     */
    public Map<String, String> getRes() {
        return res;
    }

    /**
     * Affectation de res
     * 
     * @param res res à affecter
     */
    public void setRes(Map<String, String> res) {
        this.res = res;
    }

    /**
     * Accesseur de typeSaisie
     * 
     * @return le typeSaisie
     */
    public String getTypeSaisie() {
        return typeSaisie;
    }

    /**
     * Affectation de typeSaisie
     * 
     * @param typeSaisie typeSaisie à affecter
     */
    public void setTypeSaisie(String typeSaisie) {
        this.typeSaisie = typeSaisie;
    }

    /**
     * Accesseur de description
     * 
     * @return le description
     */
    public String getDescription() {
        return description;
    }

    /**
     * Affectation de description
     * 
     * @param description description à affecter
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * Accesseur de idDemande
     * 
     * @return le idDemande
     */
    public int getIdDemande() {
        return idDemande;
    }

    /**
     * Affectation de idDemande
     * 
     * @param idDemande idDemande à affecter
     */
    public void setIdDemande(int idDemande) {
        this.idDemande = idDemande;
    }

    /**
     * Accesseur de idParamDemande
     * 
     * @return le idParamDemande
     */
    public int getIdParamDemande() {
        return idParamDemande;
    }

    /**
     * Affectation de idParamDemande
     * 
     * @param idParamDemande idParamDemande à affecter
     */
    public void setIdParamDemande(int idParamDemande) {
        this.idParamDemande = idParamDemande;
    }

    /**
     * Accesseur de referenceDemande
     * 
     * @return le referenceDemande
     */
    public String getReferenceDemande() {
        return referenceDemande;
    }

    /**
     * Affectation de referenceDemande
     * 
     * @param referenceDemande referenceDemande à affecter
     */
    public void setReferenceDemande(String referenceDemande) {
        this.referenceDemande = referenceDemande;
    }

    /**
     * Accesseur de titreDemande
     * 
     * @return le titreDemande
     */
    public String getTitreDemande() {
        return titreDemande;
    }

    /**
     * Affectation de titreDemande
     * 
     * @param titreDemande titreDemande à affecter
     */
    public void setTitreDemande(String titreDemande) {
        this.titreDemande = titreDemande;
    }

    /**
     * Accesseur de idCDDemande
     * 
     * @return le idCDDemande
     */
    public int getIdCDDemande() {
        return idCDDemande;
    }

    /**
     * Affectation de idCDDemande
     * 
     * @param idCDDemande idCDDemande à affecter
     */
    public void setIdCDDemande(int idCDDemande) {
        this.idCDDemande = idCDDemande;
    }

    /**
     * Accesseur de commentaireDemande
     * 
     * @return le commentaireDemande
     */
    public String getCommentaireDemande() {
        return commentaireDemande;
    }

    /**
     * Affectation de commentaireDemande
     * 
     * @param commentaireDemande commentaireDemande à affecter
     */
    public void setCommentaireDemande(String commentaireDemande) {
        this.commentaireDemande = commentaireDemande;
    }

    /**
     * Accesseur de error
     * 
     * @return le error
     */
    public String getError() {
        return error;
    }

    /**
     * Affectation de error
     * 
     * @param error error à affecter
     */
    public void setError(String error) {
        this.error = error;
    }

    /**
     * Accesseur de paramsDemande
     * 
     * @return le paramsDemande
     */
    public Map<String, String> getParamsDemande() {
        return paramsDemande;
    }

    /**
     * Affectation de paramsDemande
     * 
     * @param paramsDemande paramsDemande à affecter
     */
    public void setParamsDemande(Map<String, String> paramsDemande) {
        this.paramsDemande = paramsDemande;
    }

    /**
     * Accesseur de paramsMulti
     * 
     * @return le paramsMulti
     */
    public Map<String, String> getParamsMulti() {
        return paramsMulti;
    }

    /**
     * Affectation de paramsMulti
     * 
     * @param paramsMulti paramsMulti à affecter
     */
    public void setParamsMulti(Map<String, String> paramsMulti) {
        this.paramsMulti = paramsMulti;
    }

    /**
     * Accesseur de obligatoire
     * 
     * @return le obligatoire
     */
    public String getObligatoire() {
        return obligatoire;
    }

    /**
     * Affectation de obligatoire
     * 
     * @param obligatoire obligatoire à affecter
     */
    public void setObligatoire(String obligatoire) {
        this.obligatoire = obligatoire;
    }

    /**
     * Accesseur de paramsListe
     * 
     * @return le paramsListe
     */
    public Map<String, String> getParamsListe() {
        return paramsListe;
    }

    /**
     * Affectation de paramsListe
     * 
     * @param paramsListe paramsListe à affecter
     */
    public void setParamsListe(Map<String, String> paramsListe) {
        this.paramsListe = paramsListe;
    }

    /**
     * Accesseur de listeIdCDPointsControle
     * 
     * @return le listeIdCDPointsControle
     */
    public LinkedList<String> getListeIdCDPointsControle() {
        return listeIdCDPointsControle;
    }

    /**
     * Accesseur de listeNomsCDPointsControle
     * 
     * @return le listeNomsCDPointsControle
     */
    public LinkedList<String> getListeNomsCDPointsControle() {
        return listeNomsCDPointsControle;
    }

    /**
     * Affectation de listeIdCDPointsControle
     * 
     * @param listeIdCDPointsControle listeIdCDPointsControle à affecter
     */
    public void setListeIdCDPointsControle(LinkedList<String> listeIdCDPointsControle) {
        this.listeIdCDPointsControle = listeIdCDPointsControle;
    }

    /**
     * Affectation de listeNomsCDPointsControle
     * 
     * @param listeNomsCDPointsControle listeNomsCDPointsControle à affecter
     */
    public void setListeNomsCDPointsControle(LinkedList<String> listeNomsCDPointsControle) {
        this.listeNomsCDPointsControle = listeNomsCDPointsControle;
    }

    /**
     * Accesseur de dateCorrecte
     * 
     * @return le dateCorrecte
     */
    public String getDateCorrecte() {
        return dateCorrecte;
    }

    /**
     * Affectation de dateCorrecte
     * 
     * @param dateCorrecte dateCorrecte à affecter
     */
    public void setDateCorrecte(String dateCorrecte) {
        this.dateCorrecte = dateCorrecte;
    }

    /**
     * Accesseur de dateAVerifier
     * 
     * @return le dateAVerifier
     */
    public String getDateAVerifier() {
        return dateAVerifier;
    }

    /**
     * Affectation de dateAVerifier
     * 
     * @param dateAVerifier dateAVerifier à affecter
     */
    public void setDateAVerifier(String dateAVerifier) {
        this.dateAVerifier = dateAVerifier;
    }

}
